package com.shadow.study.test.线程1;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Map;

/**
 * 阶段回调更新处理类
 * 用于在当前后端服务中保证有且只能有一个线程去处理对应阶段的更新
 * 此类的方式仅能解决单服务多线程的并发情况
 * @author zhamuqingfeng
 */
public class ReceiveNotifyHandlerManage {

    private ReceiveNotifyHandlerManage() {
    }

    private static final Map<String, ReceiveNotifyHandler> cacheMap = new HashMap<>();

    /**
     * 异步接口执行结果统一处理
     * 场景1.部里成功执行回调服务
     * 场景2.部里因某种原因未执行回调服务,定时机制主动处理
     *
     * @param requestId       requestId
     * @param notifyData      回调信息(场景1->不为空 场景2->为空)
     * @param failFuncHandler 是否是定时机制主动处理(场景1->false 场景2->true)
     * @param isDestroy       是否是执行销毁操作
     * @return requestId获取阶段失败, isDestroy为true, 存在其他线程已处理当前stage时 返回空值
     */
    public static synchronized ReceiveNotifyHandler getOrDestroyHandler(
            String requestId,
            JSONObject notifyData,
            boolean failFuncHandler,
            boolean isDestroy
    ) {
        // 当前实行处理器的销毁
        if (isDestroy) {
            cacheMap.remove(requestId);
            return null;
        }
//        PrStage stage = BeanUtil.getBeanByType(PrReportService.class).getStageByRequestId(requestId);
//        // 阶段获取失败 返回空
//        if (stage == null) {
//            return null;
//        }
        ReceiveNotifyHandler receiveNotifyHandler = cacheMap.get(requestId);
        // 已存在其他线程正在处理当前阶段 返回空
        if (receiveNotifyHandler != null) {
            return null;
        } else {
            receiveNotifyHandler = new ReceiveNotifyHandler(requestId, notifyData, failFuncHandler);
            cacheMap.put(requestId, receiveNotifyHandler);
            return receiveNotifyHandler;
        }
    }
}
